perm filename HASHCS.PAS[S1,ALS] blob sn#419044 filedate 1979-02-16 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(*PROGRAM HEADER PAGE*)
C00005 00003	program PRINTHASH (INPUT,OUTPUT)
C00008 00004	function CSP_HASH (var NAM :  ALFA) :  integer
C00017 ENDMK
CāŠ—;
(*PROGRAM HEADER PAGE*)

(*PAS10 OPTIONS*) (*$D+,R32,S1300*)			(*X10S1*)

(*							     DEFAULT

D+	DEBUG AND POSTMORTEM DUMP				-
E+	EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED		-
Fn	FILE OPTION						1
I+	FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES		-
L+	OBJECT LISTING						-
Rn	SIZE OF LOW-SEGMENT				(SEE PAS10 MANUAL)
Sn	MAX INSTRUCTIONS PER STATEMENT			       1000
T+	RUNTIME CHECK						+
U+	72 COLUMN FORMAT					-
Xn	HIGHEST REGISTER FOR PARAMETERS				6
*)

(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)

(*							     DEFAULT

A+	GENERATE 370 OBJECT MODULE				-
A-	GENERATE 370 ASSEMBLY MODULE
B+	BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS		-
C+	EMIT PCODE						+
D+	RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES	-
E+	FILE IS IN EBCDIC CHARACTER SET				-
F+	SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY			+
K+	ENABLE STATEMENT EXECUTION COUNTING			-
L+	LIST SOURCE PROGRAM					+
M+	72 COLUMN FORMAT					+
P+	DOUBLE-WORD BOUNDARY ALIGNMENT				-
S+	SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY			+
T+	PRINT SYMBOL TABLES (FOR POST-PROCESSOR)		-
U+	GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR.	-
V+	?? 3RD PCODE BGN INSTRUCTION PARAMETER			-
X+	USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES	-
X-	GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)

(*S1 PCPASC OPTION DIFFERENCES*) (* A+,B+,D+,L-,M120*)	(*X10S1*)



(*							     DEFAULT

A+	GENERATE S1 ASSEMBLY MODULE				-
A-	GENERATE S1 OBJECT MODULE
*)

(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
program PRINTHASH (INPUT,OUTPUT);

const
CSPHTSIZE = 91;   		(*prime*)
CSPHTSIZEM1 = 90;

type
CHAR3 = packed array [1..3] of char;
ALFALEN = 1..8;
ALFA = packed array [ALFALEN] of char;
NAMEREC = record   NAM :  ALFA;  LEN :  ALFALEN   end;

P_STANDARDPROC = (
    QATN, QCLK, QCOS, QEIO, QELN, QEOF, QEXP, QGET, QLOG, QNEW,
    QPUT, QRDB, QRDC, QRDI, QRDR, QRDS, QRES, QREW, QRLN, QRST,
    QSAV, QSIN, QSIO, QSQT, QTRP, QWLN, QWRB, QWRC, QWRI, QWRR,
    QWRS, QXIT);

var
    I : 0..CSPHTSIZEM1;
    H : 0..CSPHTSIZEM1;
    J : integer;
    K : integer;
    L1,L2,L3 : integer;
    M1,M2,M3 : integer;
    CSP :  P_STANDARDPROC;

    CSPHASHTAB :  array [0..CSPHTSIZEM1] of
			record
			CSPNAM :  NAMEREC;
  			CSP :  P_STANDARDPROC;
(*			HIT : integer *)
			end (*CSPHASHTAB*);

function CSP_HASH (var NAM :  ALFA) :  integer;
    begin
(*  CSP_HASH := (ord(NAM[1])*676 + ord(NAM[2])*26 + ord(NAM[3])) *)
    CSP_HASH := (ord(NAM[1])*M1 + ord(NAM[2])*M2 + ord(NAM[3])*M3) 
		mod CSPHTSIZE;
    end (*CSP_HASH*);

    procedure ENTER_CSP (NAM :	CHAR3;	CSP :  P_STANDARDPROC);
	var H : 0..CSPHTSIZEM1;
	    NAMALFA :  ALFA;
	begin
	NAMALFA := '        ';
	NAMALFA[1]:=NAM[1]; NAMALFA[2]:=NAM[2]; NAMALFA[3]:=NAM[3];
	H := CSP_HASH(NAMALFA);
	while CSPHASHTAB[H].CSPNAM.NAM <> '        ' do
	    begin
	    H := (H + 1) mod CSPHTSIZE;
	    J := J + 1;
	(*  K := 0;*)
	    end;
	CSPHASHTAB[H].CSPNAM.NAM := NAMALFA;
	CSPHASHTAB[H].CSPNAM.LEN := 3;
	CSPHASHTAB[H].CSP := CSP;
(*	CSPHASHTAB[H].HIT := K; *)
	end (*ENTER_CSP*);
  
procedure PRINT_CSP;
    var H : 0..CSPHTSIZEM1;
    begin
    WRITELN;
    for H := 0 to CSPHTSIZEM1 do
	begin
	WRITE (OUTPUT,H,'  ');
	if CSPHASHTAB[H].CSPNAM.NAM = '        ' then WRITELN else
	    begin
	    WRITELN (OUTPUT,CSPHASHTAB[H].CSPNAM.NAM,CSPHASHTAB[H].CSP);
(*	    if CSPHASHTAB[H].HIT = 0 then WRITELN else
		WRITELN (OUTPUT,CSPHASHTAB[H].HIT); *)
	    end;
	end;
    end;
  
begin (*MAIN PROGRAM*)
K := 1000;
M1 := 8;
while M1 < 1025 do
  begin
  M1 := M1*2;
  M2 := 1;
  while M2 < 129 do
    begin
    M2 := M2*2;
    M3 := 0;
    while M3 < 16 do
      begin
      M3 := M3+1;

      for I := 0 to CSPHTSIZEM1 do
	begin
	CSPHASHTAB[I].CSPNAM.NAM := '        ';
	CSPHASHTAB[I].CSPNAM.LEN := 1;
	end;
      J := 0;

      ENTER_CSP ('ATN', QATN);        ENTER_CSP ('EXP', QEXP);
      ENTER_CSP ('SIN', QSIN);        ENTER_CSP ('COS', QCOS);
      ENTER_CSP ('LOG', QLOG);        ENTER_CSP ('SQT', QSQT);
      ENTER_CSP ('CLK', QCLK);        ENTER_CSP ('XIT', QXIT);
      ENTER_CSP ('TRP', QTRP);        ENTER_CSP ('GET', QGET);
      ENTER_CSP ('PUT', QPUT);        ENTER_CSP ('RLN', QRLN);
      ENTER_CSP ('WLN', QWLN);        ENTER_CSP ('RES', QRES);
      ENTER_CSP ('REW', QREW);        ENTER_CSP ('RDC', QRDC);
      ENTER_CSP ('RDI', QRDI);        ENTER_CSP ('RDR', QRDR);
      ENTER_CSP ('RDS', QRDS);        ENTER_CSP ('WRC', QWRC);
      ENTER_CSP ('RDB', QRDB);        ENTER_CSP ('WRB', QWRB);
      ENTER_CSP ('WRI', QWRI);        ENTER_CSP ('WRR', QWRR);
      ENTER_CSP ('WRS', QWRS);        ENTER_CSP ('ELN', QELN);
      ENTER_CSP ('EOF', QEOF);        ENTER_CSP ('SIO', QSIO);
      ENTER_CSP ('EIO', QEIO);        ENTER_CSP ('NEW', QNEW);
      ENTER_CSP ('SAV', QSAV);        ENTER_CSP ('RST', QRST);

      if J < K then
	begin
	K := J;
	WRITELN (OUTPUT,M1,' M1',M2,' M2',M3,' M3',K,' K');
	if K = 0 then PRINT_CSP;
	end;
      end;
    end;
  end;
end.